--[[
  1. key - 限流接口的key

  1. limitCount - 时间窗口最大流量限制数量
  2. currentTime - 【当前时间戳】获取当前时间，单位毫秒，作为Zset元素的score值
  3. timeKey - 【当前时间戳的key值】，作为Zset元素的value值，必须保持唯一，不能直接采用时间戳
  4. timeRange - 【时间窗口范围】，传参单位：秒，默认窗口一秒
  5. expiration - 【key过期时间】，当key过期时会存在瞬时并发的情况，因此过期时间不能太短或者改用定时清除，传参单位秒，默认5min
]] --
local key = string.gsub(KEYS[1], '^["]*([^"].*[^"])["]*$', "%1") -- 去除key两侧的双引号
local limitCount = tonumber(ARGV[1])
local currentTime = tonumber(ARGV[2])
local timeKey = ARGV[3]

local timeRange
if ARGV[4] == nil then
    timeRange = 1000
else
    timeRange = tonumber(ARGV[4]) * 1000
end

local expiration
if ARGV[5] == nil then
    expiration = 300
else
    expiration = tonumber(ARGV[5])
end

-- 前一秒内已访问的次数
local beforeCount = 0
local existKey = redis.call('exists', key)
if (existKey == 1) then
    -- 计算前一秒访问次数
    beforeCount = redis.call('zcount', key, currentTime - timeRange, currentTime)
end
-- 记录当前访问时间
redis.call('zadd', key, currentTime, timeKey)
local result = 0
if (limitCount > beforeCount) then
    result = 1
end
-- 设置过期时间
redis.call('expire', key, expiration)
return result